package com.arpa.wms.service;

import com.arpa.wms.domain.dto.ExpenseDetailDTO;
import com.arpa.wms.domain.dto.ExpenseDetailSettlementDTO;
import com.arpa.wms.domain.dto.OperationCostSourceDataDTO;
import com.arpa.wms.domain.entity.ExpenseDetail;
import com.arpa.wms.domain.vo.ExpenseDetailVO;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.Future;

/**
 * <p>
 * 仓库费用明细 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-11-17
 */
public interface IExpenseDetailService extends IService<ExpenseDetail> {


    /**
     * 修改费用明细金额
     * @param code 费用明细标识
     * @param amount 费用金额
     * @param remarks 备注
     * @return
     */
    boolean updateAmount(String code, BigDecimal amount, String remarks);

    /**
     * 查询列表
     * @param expenseDetailDTO
     * @return
     */
    List<ExpenseDetailVO> queryList(ExpenseDetailDTO expenseDetailDTO);

    /**
     * 查询合计,包含总数
     * @param expenseDetailDTO
     * @return
     */
    ExpenseDetailVO queryListSum(ExpenseDetailDTO expenseDetailDTO);

    /**
     * 定时生成仓储费用记录
     *  TODO 迭代计划：
     *      *  1、查询出所有有效合同
     *      *  2、遍历合同，包仓合同判断当前是否位计费日期（当前日期是否处在，开始计费日期+计费周期上，）
     *      *  3、零仓合同查询库存收货批号获取相应的入库单及入库时间，（当前日期是否处在，入库日期+计费周期上，）
     */
    @Transactional(rollbackFor = Exception.class)
    //@Async
    void generate(String groupCode);

    /**
     * 生成作业费
     * TODO 生成出入库的时候调用此方法生成仓储作业费用
     * @param sourceDataDTO 作业费生成源数据
     */
    void generateOperationCost(OperationCostSourceDataDTO sourceDataDTO);


    /**
     * 根据code 删除费用记录
     * 进行结算的不能删除
     * @param code
     * @return
     */
    boolean removeByCode(String code);

    /**
     * 检查费用是否可以结算
     * @param code
     * @return
     */
    Future check(ExpenseDetailSettlementDTO.SettlementItem code,String groupCode);


}
